﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Text;

using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Elysium.Demo;
using SIIE_ERP.BaseDatos;
using SIIE_ERP.Codigo;
using SIIE_ERP.View;

namespace Elysium.Demo.PuntoVenta.Transacciones
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class Tickets_Edita : UserControl, IPropiedadesNavegacion
    {
        ////////////////////////////////////////////////////////////////////////////
        //  PROPIEDADES DE NAVEGACION
        public string Texto { get { return _texto; } }
        public TabControl TabControlPadre { get { return _tabControlPadre; } }
        public TabItem TabItemPadre { get { return _tabItemPadre; } }

        private string _texto, secuenciaT , CodigoBarra,codigoAddon;
        private TabControl _tabControlPadre;
        private TabItem _tabItemPadre;

        public void setParametros(string Texto, ref TabControl tabControl, ref TabItem tabItem)
        {
            this._texto = Texto; this._tabControlPadre = tabControl; this._tabItemPadre = tabItem;
        }

        private void ButtonRegresar_Click(object sender, RoutedEventArgs e)
        {
            _tabControlPadre.Items.Remove(_tabItemPadre);
        }
        // FIN DE PROPIEDADES DE NAVEGACION
        ///////////////////////////////////////////////////////////////////////////

        private UsuarioActivo _sesion;
        private Int32 Id;
        private Int32 IdTerminal;
        private bool EnEfectivo;
		
        public Tickets_Edita(UsuarioActivo usuario, string Id)
        {
            InitializeComponent();
            this._sesion = usuario;
            this.Id = Int32.Parse(Id);
            CargarDatos();
            CargarPartidas();
        }

        private void ButtonInformacion_Click_1(object sender, RoutedEventArgs e)
        {
            WindowAyuda Ayuda = new Elysium.Demo.WindowAyuda("Tickets.htm", "Ayuda");
            Ayuda.Owner = SIIE_ERP.View.NavegacionUI.GetParentWindow(this); Ayuda.ShowDialog();
        }

        private void CargarDatos()
        {
            var db = new SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Tickets(_sesion.RFC, _sesion.UserName);
            var ticket = db.Get_Ticket_Por_Id(Id.ToString()).Rows[0] as DataRow;

            LabelIdTicket.Content = ticket["Secuencia"].ToString();
            LabelFecha.Content = ticket["Fecha_Ticket"].ToString();
            LabelEstatus.Content = SIIE_ERP.View.Mensajes.getMessage((SIIE_ERP.BaseDatos.EstatusDocs_Id)ticket["Estatus"]);

            LabelPartidas.Content = ticket["Partidas"].ToString();
            LabelSubtotal.Content = Double.Parse(ticket["Subtotal"].ToString()).ToString("C");

            LabelDescuento.Content = Double.Parse(ticket["Descuento"].ToString()).ToString("C");
            LabelImpuesto.Content = Double.Parse(ticket["Impuesto"].ToString()).ToString("C");
            LabelTotal.Content = Double.Parse(ticket["Total"].ToString()).ToString("C");

            IdTerminal = Int32.Parse(ticket["Id_Terminal"].ToString());
            EnEfectivo = bool.Parse(ticket["EsEfectivo"].ToString());

            var numReimpresiones = db.Numero_Reimpresiones_Ticket(Id.ToString());
             secuenciaT = ticket["Secuencia"].ToString();
            LabelReimpresiones.Content = numReimpresiones.ToString();

        }

        private void CargarPartidas()
        {
            var db = new SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Tickets(_sesion.RFC, _sesion.UserName);
            var partidas = db.Get_Partidas_Ticket_Por_Id(Id.ToString()).Rows;

            PartidasDataGrid.Items.Clear();

            foreach (DataRow p in partidas)
            {
                var Secuencia = p["Secuencia"].ToString();
                var IdArticulo = p["Id_Articulo"].ToString();
                var Cantidad = p["Cantidad"].ToString();
                var NombreCorto = p["NombreCorto"].ToString();
                var PrecioUnitario = Double.Parse(p["Precio_Unitario"].ToString()).ToString("C");
                var PorcentajeDescuento = p["Porc_Descuento"].ToString();
                var Impuesto = Double.Parse(p["Impuesto"].ToString()).ToString("C");
                var Total = Double.Parse(p["Precio_Total"].ToString()).ToString("C");
                PartidasDataGrid.Items.Add(new CPartida(Secuencia, IdArticulo, Cantidad, NombreCorto,
                                                        PrecioUnitario, PorcentajeDescuento, Impuesto, 
                                                        Total));
            }
        }

        class CPartida
        {
            public string Secuencia { get; set; }
            public string IdArticulo { get; set; }
            public string Cantidad { get; set; }
            public string NombreCorto { get; set; }
            public string PrecioUnitario { get; set; }
            public string PorcentajeDescuento { get; set; }
            public string Impuesto { get; set; }
            public string Total { get; set; }

            public CPartida(string Secuencia,
                            string IdArticulo,
                            string Cantidad,
                            string NombreCorto,
                            string PrecioUnitario,
                            string PorcentajeDescuento,
                            string Impuesto,
                            string Total)
            {
                this.Secuencia = Secuencia;
                this.IdArticulo = IdArticulo;
                this.Cantidad = Cantidad;
                this.NombreCorto = NombreCorto;
                this.PrecioUnitario = PrecioUnitario;
                this.PorcentajeDescuento = PorcentajeDescuento;
                this.Impuesto = Impuesto;
                this.Total = Total;
            }
        }

        private void Button_Reimprimir_Click(object sender, RoutedEventArgs e)
        {
            // Agrega el registro de reimpresion

            var db = new SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Trans_Reimpresion(_sesion.RFC, _sesion.UserName);
            db.Insert_Reimpresion(Id.ToString(), _sesion.IdUsuario);

            // TODO: Reimprimir el ticket :P

            ////////////////////////////   Impresión del Ticket
            PrintDialog dialog = new PrintDialog();

            string s = "";
            string Encabezado = FuncionesClass.GetCabeceraTicket(_sesion.RFC, _sesion.UserName, IdTerminal) + "\nTicket No.: " + secuenciaT;
            s =  Encabezado + "\n\n" + "------------------------------" + "\n\n";

            foreach (CPartida a in PartidasDataGrid.Items)
            {
                
                int Len = a.Cantidad.ToString().Length;
                
                s += a.Cantidad.ToString();

                if (Len == 4)
                    s += " ";
                else if (Len == 3)
                    s += "  ";
                else if (Len == 2)
                    s += "   ";
                else if (Len == 1)
                    s += "    ";

                s += a.NombreCorto;

                
                for(int i = 0;  i < 13 - a.NombreCorto.Length; i++)
                {
                    s += " ";
                }
                
                s += Double.Parse(a.Total, NumberStyles.Currency).ToString("C");
                s += "\n";
            }

            s += "\n\n";

            if (EnEfectivo)
                s += "Forma de Pago: Efectivo\n";
            else
                s += "Forma de Pago: Tarjeta\n";

  
            s += "Subtotal: " + LabelSubtotal.Content.ToString() + "\n";
            s += "IVA: " + (Double.Parse(LabelTotal.Content.ToString(), NumberStyles.Currency) - Double.Parse(LabelSubtotal.Content.ToString(), NumberStyles.Currency)).ToString("C") + "\n";
            s += "Total: " + LabelTotal.Content.ToString() + "\n"+"\n";
            
            var tb = new TextBlock
            {
                FontFamily= new FontFamily("Consolas"),
                Text = s
            };
            codigoAddon = "";
            CodigoBarra = "";
            CodigoBarra = secuenciaT.Substring(0, 12);
            codigoAddon = secuenciaT.Substring(12);
            string m_final = "";
          //  m_final = EANTrece(CodigoBarra) + AddOn(codigoAddon);

            //var tb2 = new TextBlock { FontFamily = new FontFamily("Code EAN13"),FontSize=44, Text = m_final };
            m_final = secuenciaT;
            var tb2 = new TextBlock { FontFamily = new FontFamily("EanBwrP36Tt"), FontSize = 20, Text = m_final };
            //var tb3 = new TextBlock
            //{
            //    FontFamily = new FontFamily("Consolas"),
            //    Text = secuenciaT
            //};

            tb.Inlines.Add(tb2);
            //tb.Inlines.Add("\n");
            //tb.Inlines.Add(tb3);
            dialog.PrintVisual(tb, "");

            ////////////////////////////   FIN
            CargarDatos();

        }
        public object EANTrece(string valor)
        {
            object functionReturnValue = null;
            int i;
            int m_validador = 0;
            int m_primero;
            string CodigoBarra;
            bool tableA;
            functionReturnValue = "";
            if (valor.Length == 12)
            {
                for (i = 1; i <= 12; i++)
                {
                    int L1 = Convert.ToChar(valor.Substring(i - 1, 1));
                    if (L1 < 48 || L1 > 57)
                    {
                        i = 0;
                        break;
                    }
                }
                if (i == 13)
                {
                    for (i = 12; i >= 1; i += -2)
                    {
                        m_validador = m_validador + Convert.ToInt32(valor.Substring(i - 1, 1));
                    }
                    m_validador = m_validador * 3;
                    for (i = 11; i >= 1; i += -2)
                    {
                        m_validador = m_validador + Convert.ToInt32(valor.Substring(i - 1, 1));
                    }
                    valor = valor + (10 - m_validador % 10) % 10;
                    CodigoBarra = valor.Substring(0, 1) + Convert.ToChar(65 + Convert.ToInt32((valor.Substring(1, 1))));
                    m_primero = Convert.ToInt32(valor.Substring(0, 1));

                    for (i = 3; i <= 7; i++)
                    {
                        tableA = false;
                        switch (i)
                        {
                            case 3:
                                switch (m_primero)
                                {
                                    case 0:
                                    case 1:
                                    case 2:
                                    case 3:
                                        tableA = true;
                                        break;
                                }
                                break;
                            case 4:
                                switch (m_primero)
                                {
                                    case 0:
                                    case 4:
                                    case 7:
                                    case 8:
                                        tableA = true;
                                        break;
                                }
                                break;
                            case 5:
                                switch (m_primero)
                                {
                                    case 0:
                                    case 1:
                                    case 4:
                                    case 5:
                                    case 9:
                                        tableA = true;
                                        break;
                                }
                                break;
                            case 6:
                                switch (m_primero)
                                {
                                    case 0:
                                    case 2:
                                    case 5:
                                    case 6:
                                    case 7:
                                        tableA = true;
                                        break;
                                }
                                break;
                            case 7:
                                switch (m_primero)
                                {
                                    case 0:
                                    case 3:
                                    case 6:
                                    case 8:
                                    case 9:
                                        tableA = true;
                                        break;
                                }
                                break;
                        }
                        if (tableA)
                        {
                            CodigoBarra = CodigoBarra + Convert.ToChar(65 + Convert.ToInt32(valor.Substring(i - 1, 1)));
                        }
                        else
                        {
                            CodigoBarra = CodigoBarra + Convert.ToChar(75 + Convert.ToInt32(valor.Substring(i - 1, 1)));
                        }
                    }
                    CodigoBarra = CodigoBarra + "*";
                    for (i = 8; i <= 13; i++)
                    {
                        CodigoBarra = CodigoBarra + Convert.ToChar(97 + Convert.ToInt32(valor.Substring(i - 1, 1)));
                    }
                    CodigoBarra = CodigoBarra + "+";
                    functionReturnValue = CodigoBarra;
                }
            }
            return functionReturnValue;
        }

        public string AddOn(string valor)
        {
            int i;
            int checksum = 0;
            string AddOnn = "";

            bool tableA;

            if (valor.Length == 2 || valor.Length == 5)
            {
                for (i = 1; i < valor.Length; i++)
                {
                    int L1 = Convert.ToChar(valor.Substring(i - 1, 1));

                    if (L1 < 48 || L1 > 57)
                    {
                        break;
                    }
                    if (valor.Length == 2)
                    {
                        checksum = 10 + Convert.ToInt32(valor) % 4;
                    }
                    else if (valor.Length == 5)
                    {
                        for (i = 1; i == 5; i = i - 2)
                        {
                            checksum = checksum + Convert.ToInt32(valor.Substring(i - 1, 1));
                        }
                        checksum = (checksum * 3 + Convert.ToInt32(valor.Substring(2, 1)) * 9 + Convert.ToInt32(valor.Substring(4, 1)) * 9) % 10;
                    }
                    AddOnn = "[";
                    for (i = 1; i <= valor.Length; i++)
                    {
                        tableA = false;

                        switch (i)
                        {
                            case 1:
                                int[] str = { 4, 9, 10, 11 };
                                for (int j = 0; j < str.Length; j++)
                                {
                                    if (str[j] == checksum)
                                    {
                                        tableA = false;
                                        break;
                                    }
                                }
                                break;

                            case 2:
                                int[] str1 = { 1, 2, 3, 5, 6, 7, 10, 12 };
                                for (int j = 0; j < str1.Length; j++)
                                {
                                    if (str1[j] == checksum)
                                    {
                                        tableA = false;
                                        break;
                                    }
                                }
                                break;
                            case 3:
                                int[] str2 = { 0, 2, 3, 6, 7 };
                                for (int j = 0; j < str2.Length; j++)
                                {
                                    if (str2[j] == checksum)
                                    {
                                        tableA = false;
                                        break;
                                    }
                                }
                                break;
                            case 4:
                                int[] str3 = { 1, 3, 4, 8, 9 };
                                for (int j = 0; j < str3.Length; j++)
                                {
                                    if (str3[j] == checksum)
                                    {
                                        tableA = false;
                                        break;
                                    }
                                }
                                break;
                            case 5:
                                int[] str4 = { 0, 1, 2, 4, 5, 7 };
                                for (int j = 0; j < str4.Length; j++)
                                {
                                    if (str4[j] == checksum)
                                    {
                                        tableA = false;
                                        break;
                                    }
                                }
                                break;
                        }

                        if (tableA)
                            AddOnn = AddOnn + Convert.ToChar(65 + Convert.ToInt32(valor.Substring(i - 1, 1)));
                        else
                            AddOnn = AddOnn + Convert.ToChar(75 + Convert.ToInt32(valor.Substring(i - 1, 1)));

                        if ((valor.Length == 2 && i == 1) || (valor.Length == 5 && i < 5))
                            AddOnn = AddOnn + Convert.ToChar(92);

                    }


                }
            }
            return AddOnn;
        }

    }
}
